<?php

function disableAutoSave(){wp_deregister_script('autosave');}
add_action( 'wp_print_scripts', 'disableAutoSave' );
add_theme_support('menus');


add_action('admin_menu', 'create_menu');

function create_menu() {

	add_menu_page('Op&ccedil;&otilde;es', 'Op&ccedil;&otilde;es especiais', 'publish_posts', 'extra_mc', 'settings_page','',0);
	add_action( 'admin_init', 'register_mysettings' );
}
function register_mysettings() { // registrando recursos de sistema

 	criaSetting('ajax','Pagina ajax');
	
}
function criaSetting($settingName,$titulo,$template=''){
  // registrando
  register_setting( 'template', $settingName );
  //verificando se a pagina existe
   $args = array(
  					'post_type'		=>	'sistema',
					'meta_key'		=>	'_acao',
					'meta_value'	=>	$settingName,
					'post_status'	=>	'any',
					'numberposts'	=> 1
  					);
	$cad = get_posts($args);
	$existeCad = false;
	foreach($cad as $c){
	 	//wp_delete_post($c->ID,true);
		update_option($settingName,$c->ID);
		if($template!=''){
			UPM($c->ID,'_template',$template);
		}
		$existeCad = true;
	}
	//se nao existe, cria uma nova pagina
	if(!$existeCad){
		$my_post = array();
		$my_post['post_title'] =  $titulo;
		$my_post['post_type'] =  'sistema';
		$my_post['post_status'] = 'publish';
		$my_post['post_author'] = 1;
		$id = wp_insert_post( $my_post );
		UPM($id,'_acao',$settingName);
		update_option($settingName,$id);
		if($template!=''){
			UPM($id,'_template',$template);
		}
	}
	
	
}


// FUNÇÕES DE INCLUSÃO DE NOVOS TIPOS DE POST

// Comando para adinionar novos tipos de postagem. 'init' é a ação do wordpress e 'product_register' é a função onde definimos os parâmetros básicos do novo tipo de post
add_action('init', 'product_register');

// função de para criar novos tipos de postagem
function product_register() {
	// cada array como '$video', será um novo tipo de post
		  $cadastro = array(
			'label' => __('Cadastros'), // Título que aparecerá no menu lateral direito do wordpress
        	'singular_label' => __('cadastro'),
        	'public' => true, // define se estes posts serão publicos ou privados (private)
        	'show_ui' => true,
        	'capability_type' => 'post', // que tipo de autoridade o usuário deve ter para editar esse tipo de postagem
        	'hierarchical' => false,
        	'rewrite' => true,
        	'supports' => array('title', 'excerpt') // elementos presentes no formulário de edião do post
        );
		// cada novo tipo de post deve ter um array e um comando 'register_post_tipe' onde a primeira variável se tornará o futuro '$post->post_type'
    	register_post_type( 'cadastro' , $cadastro);
	//	register_taxonomy("categoria_cadastro", array("cadastro"), array("hierarchical" => true, "label" => "Categorias", "singular_label" => "Categoria", "rewrite" => true));
		
		flush_rewrite_rules( false );
}

add_action("admin_init", "boxBanner");
// Funcção para cirar os campos customizados
function boxBanner(){
		//comando para incluir conjuto de campos onde
			//'info-meta' é o ID único do conjuto de campos
			//'Informação adicional' é o título do box onde será exibido o conjunto
			//'meta_box' é a função onde está o html do conjuto de campos
			//'post' é o tipo de postagem (post_type) em que o conjuto de campos deve ser aplicado
			//'normal' é a coluna onde o conjunto será incluido ('side' faria com que o conjunto aparecesse à esquerda)
			//'low' é a altura em que o cojunto será exibido, nessa caso, a mais inferior ('high' exibe mais ao topo)
		add_meta_box("info-meta",	"Informa&ccedil;&atilde;o adicional", "meta_box", "post","normal","low");
}
//Função responsável pela geração de um conjunto de campos customizados em um formulário de edição
function meta_box(){
		global $post; // recupera os dados do post a ser editado
		$c = get_post_custom($post->ID); // recupera os valores dos campos customizados do post a ser editado
?> 
     	<h4>Miniatura</h4>
      <p>Escolha, entre os anexos desse post, qual ser&aacute; usado como imagem principal:<br />
      <?php 
				// comando que busca as imagens que estejam anexas ao post em questão e as exibe em uma lista para escolha
				anexos($post->ID,'_thumb',90,$c["_thumb"][0]); 
			?>
		</p>
<?php }

//Função para buscar imagens anexas de um post e gerar um grupo por  'input radio' para escolha, onde
	//$id é o $post->ID do post que possui anexos
	//$name é o atributo 'name' do campo 'input' a ser criado
	//$size é a altura da miniatura a ser exibida.
	//$atual é o valor (meta_value) atualmente armazenado para este campo customizado de um determinado post 
function anexos($id,$name,$size,$atual=''){
	$args	=	array(
						    'post_parent' => $id,
						    'post_type'   => 'attachment', 
						    'numberposts' => -1,
						    'post_mime_type' => 'image'
						  );
		if($images = get_children($args)){?>
			<fieldset style="border:none; display:block; margin:0; padding:5px; width:<?php echo $size; ?>px; float:left; height:<?php echo 1.2*$size; ?>px; overflow:hidden; text-align:center;">
        	<span style="display:block; width:<?php echo $size; ?>px; background:#0CF; text-align:center; padding-top:<?php echo 0.3*$size; ?>px; height:<?php echo 0.7*$size; ?>px; font-size:12px;">
            	N&atilde;o inserir como bannner.
            </span>
			<input type="radio" name="<?php echo $name; ?>" value="" <?php if($atual==''){ echo " checked=\"checked\""; }?> />
        </fieldset>
	<?php foreach($images as $i){?>
		<fieldset style="border:none; display:block; margin:0; padding:5px; width:<?php echo $size; ?>px; float:left; height:<?php echo 1.2*$size; ?>px; overflow:hidden; text-align:center;">
        	<img src="<?php $im = wp_get_attachment_image_src($i->ID,'full'); echo $im[0]; ?>" height="<?php echo $size; ?>" /><br />
			<input type="radio" name="<?php echo $name; ?>" value="<?php $if = wp_get_attachment_image_src($i->ID,'full'); echo $if[0]; ?>" <?php if($if[0]==$atual){ echo " checked=\"checked\""; }?> />
        </fieldset>
<?php 	}?>
<br style="clear:both;" />
<?php	}else{ ?>
		<p>Ainda n&atilde;o h&aacute; imagens anexadas a este artigo.</p>		
<?php	}
}

function anexosBox($id,$name,$size){
		$args	=	array(
								'post_parent' => $id,
								'post_type'   => 'attachment', 
								'numberposts' => -1,
								'post_mime_type' => 'image'
							  );
			if($images = get_children($args)){?>
			<input type="hidden" name="escondido" value="<?php echo $id; ?>" />
			<input type="hidden" name="prenome" value="<?php echo $name; ?>" />
		<?php foreach($images as $i){
				$cus= get_post_custom($i->ID);
			?>	
			<fieldset style="border:none; display:block; margin:0; padding:5px; width:<?php echo $size; ?>px; float:left; height:<?php echo 1.3*$size; ?>px; overflow:hidden; text-align:center;">
				<img src="<?php $im = wp_get_attachment_image_src($i->ID,'thumbnail'); echo $im[0]; ?>" height="<?php echo $size; ?>" /><br />
				<span style="font-size:8px; font-family:Verdana, Geneva, sans-serif;"><?php echo $i->post_title; ?></span>
				<br />
				<input type="checkbox" name="<?php echo $value = $name.'_'.$i->ID; ?>" value="on" <?php if($cus[$value][0]=="on"){ echo " checked=\"checked\""; }?> />
			</fieldset>
	<?php 	}?>
	
	<br style="clear:both;" />
	
	<?php	}else{ ?>
	
			<p>Ainda n&atilde;o h&aacute; imagens anexadas a este artigo.</p>		<?php	}
	}
	
function anexosEscolhidos($id,$name,$size,$normal=true){
		$args	=	array(
							'post_parent' => $id,
							'post_type'   => 'attachment', 
							'numberposts' => -1,
							'post_mime_type' => 'image',
							'orderby'		=>	'menu_order',
							'order'		=>	'ASC'
							);
		if($normal){
			$lastro = 'width';
		}else{
			$lastro = 'height';
		}
		if($images = get_children($args)){
				$tem = false;
				foreach($images as $i){
					$legenda = '';
					$value = $name.'_'.$i->ID;
					$meta=get_post_meta($i->ID,$value,true);
					if($meta=="on"){
						$alt = get_post_meta($i->ID, '_wp_attachment_image_alt', true);
						$im = wp_get_attachment_image_src($i->ID,'full');
						if(!$normal){
							$legenda = '<span class="legendaNormal">'.$alt.'</span>';
						}
						$lista .='<span class="galeryItem"><img src="'.$im[0].'" '.$lastro.'="'.$size.'" onClick="$.prettyPhoto.open(\''.$im[0].'\',\'\',\''.$alt.'\');" />'.$legenda.'</span>';
						$tem=true;
					}
				}
			}
		if($tem){
				echo $lista;
		}
}
function anexosturbo($id,$name,$size,$galeria=true){
	$args	=	array(
						    'post_parent' => $id,
						    'post_type'   => 'attachment', 
						    'numberposts' => -1,
						    'post_mime_type' => 'image'
						  );
	$x1 = get_post_custom($id);
		if($images = get_children($args)){?>
			<input type="hidden" name="escondido" value="<?php echo $id; ?>" />
			<input type="hidden" name="prenome" value="_galeria" />
			<fieldset style="border:none; display:block; margin:0; padding:5px; width:<?php echo $size; ?>px; float:left;overflow:hidden; ">
        	<span style="display:block; width:<?php echo $size; ?>px; background:#0CF; text-align:center; padding-top:<?php echo 0.3*$size; ?>px; height:<?php echo 0.7*$size; ?>px; font-size:12px;">
            	N&atilde;o inserir.
            </span>
	<?php foreach($name as $n){ ?>		
			<input type="radio" name="<?php echo $n; ?>" value="" <?php if($x1[$n][0]==''){ echo " checked=\"checked\""; }?> /><?php echo $n; ?><br />
	<?php } ?>
        </fieldset>
	<?php foreach($images as $i){
		$ic = get_post_custom($i->ID);
	?>
		<fieldset style="border:solid 1px #aaa; display:block; margin:3px; padding:5px; width:<?php echo $size; ?>px; float:left; overflow:hidden;">
        	<img src="<?php $im = wp_get_attachment_image_src($i->ID,'full'); echo $im[0]; ?>" height="<?php echo $size; ?>" /><br />
			<?php if($galeria){ ?>
			<input type="checkbox" name="<?php echo $value = '_galeria_'.$i->ID; ?>" value="on" <?php if($ic[$value][0]=="on"){ echo " checked=\"checked\""; }?> />Galeria<br />
			<?php } ?>
		<?php foreach($name as $n){ ?>
			<input type="radio" name="<?php echo $n; ?>" value="<?php $if = wp_get_attachment_image_src($i->ID,'full'); echo $if[0]; ?>" <?php if($if[0]==$x1[$n][0]){ echo " checked=\"checked\""; }?> /><?php echo $n; ?><br />
		<?php } ?>	
        </fieldset>
<?php 	}?>
<br style="clear:both;" />
<?php	}else{ ?>
		<p>Ainda n&atilde;o h&aacute; imagens anexadas a este artigo.</p>		
<?php	}
}

function CallUploader($id,$string='CLIQUE AQUI PARA INSERIR IMAGENS'){ ?>
<input type="button" name="carregarImagens" id="carregadorDeImagens" value="<?php echo $string; ?>" />
<script language="javascript" type="text/javascript">
 jQuery(document).ready(function() {
				jQuery('#carregadorDeImagens').click(function() {
											  window.send_to_editor = function(html) {
												  imgurl = jQuery('img',html).attr('src');
												  jQuery('#upload_image').val(imgurl);
												  tb_remove();
												}
												tb_show('', 'media-upload.php?post_id=<?php echo $id; ?>&amp;type=image&amp;TB_iframe=true');
												return false;
				});
});
</script>
<?php }

function registrar_campo($nomeDoCampo,$tipo=''){
	$xml = get_option('metaCampos');
	if($xml==''){
		$xml = new SimpleXMLElement('<campos></campos>');
	}else{
		$xml = simplexml_load_string($xml);
	}
	$criar=true;
	foreach($xml->campo as $c){
		if($c==$nomeDoCampo){
			$criar=false;
		}
	}
	if($criar){
		$campo = $xml->addChild('campo',$nomeDoCampo);
		update_option('metaCampos',$xml->asXML());
	}	
}

 

function my_admin_scripts() {
										wp_enqueue_script('media-upload');
										wp_enqueue_script('thickbox');
										wp_register_script('my-upload', get_bloginfo('template_url') . '/functions/my-script.js', array('jquery','media-upload','thickbox'));
										wp_enqueue_script('my-upload');
}
function my_admin_styles() {
										wp_enqueue_style('thickbox');
}
add_action('admin_print_scripts', 'my_admin_scripts');
add_action('admin_print_styles', 'my_admin_styles');



class eMail
{
    var $to = array();
    var $cc = array();
    var $bcc = array();
    var $attachment = array();
    var $boundary = "";
    var $hdd = "";
    var $subject = "";
    var $body = "";

    function eMail($mail)
    {
        $this->boundary = md5(uniqid(time()));
        $this->hdd .= "From: $mail\r\n";
		  $this->hdd .= "Return-Path:  $mail\r\n";
    }

    function to($mail)
    {
    	$this->to[] = $mail;
    }

    function cc($mail)
    {
    	$this->cc[] = $mail;
    }

    function bcc($mail)
    {
    	$this->bcc[] = $mail;
    }

    function attachment($file,$name)
    {
		$this->attachment[] = $file;
		$this->filename[] = $name;
    }

    function subject($subject)
    {
    	$this->subject = $subject;
    }

    function text($text)
    {
	    $this->body = "Content-type: text/plain; charset=iso-8859-1\r\n";
	    $this->body .= "Content-Transfer-Encoding: 8bit\r\n\r\n";
	    $this->body .= $text."\r\n";
    }

    function html($html)
    {
	    $this->body = "Content-Type: text/html; charset=ISO-8859-1\r\n";
	    $this->body .= "Content-Transfer-Encoding: quoted-printable\r\n\r\n";
	    $this->body .= "<html><body>\r\n".$html."\r\n</body></html>\r\n";
    }

	function send()
    {
        $max = count($this->cc);
        if($max>0)
        {
            $this->hdd .= "Cc: ".$this->cc[0];
            for($i=1;$i<$max;$i++)
            {
                $this->hdd .= ", ".$this->cc[$i];
            }
            $this->hdd .= "\r\n";
        }
        $max = count($this->bcc);
        if($max>0)
        {
            $this->hdd .= "Bcc: ".$this->bcc[0];
            for($i=1;$i<$max;$i++)
            {
                $this->hdd .= ", ".$this->bcc[$i];
            }
            $this->hdd .= "\r\n";
        }
				  
      	$this->hdd .= "MIME-Version: 1.1\r\n";
			$this->hdd .= "Content-Type: multipart/mixed; boundary=$this->boundary\r\n\r\n";
			$this->hdd .= "This is a multi-part message in MIME format\r\n";
			$this->hdd .= "--$this->boundary\r\n";
			$this->hdd .= $this->body;

        $max = count($this->attachment);
        if($max>0)
        {
            for($i=0;$i<$max;$i++)
            {
                $file = fread(fopen($this->attachment[$i], "r"), filesize($this->attachment[$i]));
                $this->hdd .= "--".$this->boundary."\r\n";
                $this->hdd .= "Content-Type: application/x-zip-compressed; name=".$this->attachment[$i]."\r\n";
                $this->hdd .= "Content-Transfer-Encoding: base64\r\n";
                $this->hdd .= "Content-Disposition: attachment; filename=".$this->filename[$i]."\r\n\r\n";
                $this->hdd .= chunk_split(base64_encode($file))."\r\n";
                $file = "";
            }
        }
        $this->hdd .= "--".$this->boundary."--\r\n\r\n";

        foreach($this->to as $mail)
        {
            mail($mail,$this->subject,"",$this->hdd);
        }
    }
}


// FUNÇÕES DE SALVAMENTO DE CAMPOS CUSTOMIZADOS

// Comando de salvamento onde 'save_post' é a ação do wordpress e 'save_data_six' é a função que trata dos dados dos campos customizados
add_action('save_post', 'save_data_six');

// Função que realiza o salvamento de campos customizados
function save_data_six(){
	// buscando os dados do post que receberá os dados customizados
	global $post;
	// cada campo customizado deve ser tratado por um comando UPM
	UPM($post->ID, "_thumb", $_POST["_thumb"]);
	$xml = get_option('metaCampos');
	if($xml!=''){
		$xml = simplexml_load_string($xml);
		foreach($xml->campo as $c){
			UPM($post->ID, (string)$c, $_POST[(string)$c]);
		}
	}
	if(isset($_POST['escondido'])){
		$args	=	array(
				'post_parent' => $_POST['escondido'],
				'post_type'   => 'attachment', 
				'numberposts' => -1,
				'post_mime_type' => 'image'
			  );
		$prenome = $_POST['prenome'].'_';
		if($images = get_children($args)){
			foreach($images as $i){
				$value = $prenome.$i->ID;
				if(isset($_POST[$value])){
					UPM($i->ID,$value,$_POST[$value]);
				}else{
					UPM($i->ID,$value,'');
				}
			}
		}
	}
	
	
	
}

// Função UPM - Updante Post Meta - onde
	// $id é o id do post que receberá o campo customizado
	// $key é o nome do campo customizado
	// $valor é o valor a ser salvo
function UPM($id,$key,$valor){
	// se o $valor for diferente de vazio
	if($valor!=''){
		// o campo será atualizado
		update_post_meta($id,$key,$valor);
	// porém, se o $valor estiver vazio
	}else{
		// o campo será excluído
		delete_post_meta($id, $key);
	}
}


#################################################################################################
#################################################################################################
#################################################################################################
#################################################################################################
#################################################################################################
#################################################################################################
#################################################################################################
#################################################################################################


/*
This file is part of SANDBOX.

SANDBOX is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version.

SANDBOX is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with SANDBOX. If not, see http://www.gnu.org/licenses/.
*/

// Produces a list of pages in the header without whitespace
function sandbox_globalnav() {
	if ( $menu = str_replace( array( "\r", "\n", "\t" ), '', wp_list_pages('title_li=&sort_column=menu_order&echo=0') ) )
		$menu = '<ul>' . $menu . '</ul>';
	$menu = '<div id="menu">' . $menu . "</div>\n";
	echo apply_filters( 'globalnav_menu', $menu ); // Filter to override default globalnav: globalnav_menu
}

// Generates semantic classes for BODY element
function sandbox_body_class( $print = true ) {
	global $wp_query, $current_user;

	// It's surely a WordPress blog, right?
	$c = array('wordpress');

	// Applies the time- and date-based classes (below) to BODY element
	sandbox_date_classes( time(), $c );

	// Generic semantic classes for what type of content is displayed
	is_front_page()  ? $c[] = 'home'       : null; // For the front page, if set
	is_home()        ? $c[] = 'blog'       : null; // For the blog posts page, if set
	is_archive()     ? $c[] = 'archive'    : null;
	is_date()        ? $c[] = 'date'       : null;
	is_search()      ? $c[] = 'search'     : null;
	is_paged()       ? $c[] = 'paged'      : null;
	is_attachment()  ? $c[] = 'attachment' : null;
	is_404()         ? $c[] = 'four04'     : null; // CSS does not allow a digit as first character

	// Special classes for BODY element when a single post
	if ( is_single() ) {
		$postID = $wp_query->post->ID;
		the_post();

		// Adds 'single' class and class with the post ID
		$c[] = 'single postid-' . $postID;

		// Adds classes for the month, day, and hour when the post was published
		if ( isset( $wp_query->post->post_date ) )
			sandbox_date_classes( mysql2date( 'U', $wp_query->post->post_date ), $c, 's-' );

		// Adds category classes for each category on single posts
		if ( $cats = get_the_category() )
			foreach ( $cats as $cat )
				$c[] = 's-category-' . $cat->slug;

		// Adds tag classes for each tags on single posts
		if ( $tags = get_the_tags() )
			foreach ( $tags as $tag )
				$c[] = 's-tag-' . $tag->slug;

		// Adds MIME-specific classes for attachments
		if ( is_attachment() ) {
			$mime_type = get_post_mime_type();
			$mime_prefix = array( 'application/', 'image/', 'text/', 'audio/', 'video/', 'music/' );
				$c[] = 'attachmentid-' . $postID . ' attachment-' . str_replace( $mime_prefix, "", "$mime_type" );
		}

		// Adds author class for the post author
		$c[] = 's-author-' . sanitize_title_with_dashes(strtolower(get_the_author_login()));
		rewind_posts();
	}

	// Author name classes for BODY on author archives
	elseif ( is_author() ) {
		$author = $wp_query->get_queried_object();
		$c[] = 'author';
		$c[] = 'author-' . $author->user_nicename;
	}

	// Category name classes for BODY on category archvies
	elseif ( is_category() ) {
		$cat = $wp_query->get_queried_object();
		$c[] = 'category';
		$c[] = 'category-' . $cat->slug;
	}

	// Tag name classes for BODY on tag archives
	elseif ( is_tag() ) {
		$tags = $wp_query->get_queried_object();
		$c[] = 'tag';
		$c[] = 'tag-' . $tags->slug;
	}

	// Page author for BODY on 'pages'
	elseif ( is_page() ) {
		$pageID = $wp_query->post->ID;
		$page_children = wp_list_pages("child_of=$pageID&echo=0");
		the_post();
		$c[] = 'page pageid-' . $pageID;
		$c[] = 'page-author-' . sanitize_title_with_dashes(strtolower(get_the_author('login')));
		// Checks to see if the page has children and/or is a child page; props to Adam
		if ( $page_children )
			$c[] = 'page-parent';
		if ( $wp_query->post->post_parent )
			$c[] = 'page-child parent-pageid-' . $wp_query->post->post_parent;
		if ( is_page_template() ) // Hat tip to Ian, themeshaper.com
			$c[] = 'page-template page-template-' . str_replace( '.php', '-php', get_post_meta( $pageID, '_wp_page_template', true ) );
		rewind_posts();
	}

	// Search classes for results or no results
	elseif ( is_search() ) {
		the_post();
		if ( have_posts() ) {
			$c[] = 'search-results';
		} else {
			$c[] = 'search-no-results';
		}
		rewind_posts();
	}

	// For when a visitor is logged in while browsing
	if ( $current_user->ID )
		$c[] = 'loggedin';

	// Paged classes; for 'page X' classes of index, single, etc.
	if ( ( ( $page = $wp_query->get('paged') ) || ( $page = $wp_query->get('page') ) ) && $page > 1 ) {
		// Thanks to Prentiss Riddle, twitter.com/pzriddle, for the security fix below.
		$page = intval($page); // Ensures that an integer (not some dangerous script) is passed for the variable
		$c[] = 'paged-' . $page;
		if ( is_single() ) {
			$c[] = 'single-paged-' . $page;
		} elseif ( is_page() ) {
			$c[] = 'page-paged-' . $page;
		} elseif ( is_category() ) {
			$c[] = 'category-paged-' . $page;
		} elseif ( is_tag() ) {
			$c[] = 'tag-paged-' . $page;
		} elseif ( is_date() ) {
			$c[] = 'date-paged-' . $page;
		} elseif ( is_author() ) {
			$c[] = 'author-paged-' . $page;
		} elseif ( is_search() ) {
			$c[] = 'search-paged-' . $page;
		}
	}

	// Separates classes with a single space, collates classes for BODY
	$c = join( ' ', apply_filters( 'body_class',  $c ) ); // Available filter: body_class

	// And tada!
	return $print ? print($c) : $c;
}

// Generates semantic classes for each post DIV element
function sandbox_post_class( $print = true ) {
	global $post, $sandbox_post_alt;

	// hentry for hAtom compliace, gets 'alt' for every other post DIV, describes the post type and p[n]
	$c = array( 'hentry', "p$sandbox_post_alt", $post->post_type, $post->post_status );

	// Author for the post queried
	$c[] = 'author-' . sanitize_title_with_dashes(strtolower(get_the_author('login')));

	// Category for the post queried
	foreach ( (array) get_the_category() as $cat )
		$c[] = 'category-' . $cat->slug;

	// Tags for the post queried; if not tagged, use .untagged
	if ( get_the_tags() == null ) {
		$c[] = 'untagged';
	} else {
		foreach ( (array) get_the_tags() as $tag )
			$c[] = 'tag-' . $tag->slug;
	}

	// For password-protected posts
	if ( $post->post_password )
		$c[] = 'protected';

	// Applies the time- and date-based classes (below) to post DIV
	sandbox_date_classes( mysql2date( 'U', $post->post_date ), $c );

	// If it's the other to the every, then add 'alt' class
	if ( ++$sandbox_post_alt % 2 )
		$c[] = 'alt';

	// Separates classes with a single space, collates classes for post DIV
	$c = join( ' ', apply_filters( 'post_class', $c ) ); // Available filter: post_class

	// And tada!
	return $print ? print($c) : $c;
}

// Define the num val for 'alt' classes (in post DIV and comment LI)
$sandbox_post_alt = 1;

// Generates semantic classes for each comment LI element
function sandbox_comment_class( $print = true ) {
	global $comment, $post, $sandbox_comment_alt;

	// Collects the comment type (comment, trackback),
	$c = array( $comment->comment_type );

	// Counts trackbacks (t[n]) or comments (c[n])
	if ( $comment->comment_type == 'comment' ) {
		$c[] = "c$sandbox_comment_alt";
	} else {
		$c[] = "t$sandbox_comment_alt";
	}

	// If the comment author has an id (registered), then print the log in name
	if ( $comment->user_id > 0 ) {
		$user = get_userdata($comment->user_id);
		// For all registered users, 'byuser'; to specificy the registered user, 'commentauthor+[log in name]'
		$c[] = 'byuser comment-author-' . sanitize_title_with_dashes(strtolower( $user->user_login ));
		// For comment authors who are the author of the post
		if ( $comment->user_id === $post->post_author )
			$c[] = 'bypostauthor';
	}

	// If it's the other to the every, then add 'alt' class; collects time- and date-based classes
	sandbox_date_classes( mysql2date( 'U', $comment->comment_date ), $c, 'c-' );
	if ( ++$sandbox_comment_alt % 2 )
		$c[] = 'alt';

	// Separates classes with a single space, collates classes for comment LI
	$c = join( ' ', apply_filters( 'comment_class', $c ) ); // Available filter: comment_class

	// Tada again!
	return $print ? print($c) : $c;
}

// Generates time- and date-based classes for BODY, post DIVs, and comment LIs; relative to GMT (UTC)
function sandbox_date_classes( $t, &$c, $p = '' ) {
	$t = $t + ( get_option('gmt_offset') * 3600 );
	$c[] = $p . 'y' . gmdate( 'Y', $t ); // Year
	$c[] = $p . 'm' . gmdate( 'm', $t ); // Month
	$c[] = $p . 'd' . gmdate( 'd', $t ); // Day
	$c[] = $p . 'h' . gmdate( 'H', $t ); // Hour
}

// For category lists on category archives: Returns other categories except the current one (redundant)
function sandbox_cats_meow($glue) {
	$current_cat = single_cat_title( '', false );
	$separator = "\n";
	$cats = explode( $separator, get_the_category_list($separator) );
	foreach ( $cats as $i => $str ) {
		if ( strstr( $str, ">$current_cat<" ) ) {
			unset($cats[$i]);
			break;
		}
	}
	if ( empty($cats) )
		return false;

	return trim(join( $glue, $cats ));
}

// For tag lists on tag archives: Returns other tags except the current one (redundant)
function sandbox_tag_ur_it($glue) {
	$current_tag = single_tag_title( '', '',  false );
	$separator = "\n";
	$tags = explode( $separator, get_the_tag_list( "", "$separator", "" ) );
	foreach ( $tags as $i => $str ) {
		if ( strstr( $str, ">$current_tag<" ) ) {
			unset($tags[$i]);
			break;
		}
	}
	if ( empty($tags) )
		return false;

	return trim(join( $glue, $tags ));
}

// Produces an avatar image with the hCard-compliant photo class
function sandbox_commenter_link() {
	$commenter = get_comment_author_link();
	if ( ereg( '<a[^>]* class=[^>]+>', $commenter ) ) {
		$commenter = ereg_replace( '(<a[^>]* class=[\'"]?)', '\\1url ' , $commenter );
	} else {
		$commenter = ereg_replace( '(<a )/', '\\1class="url "' , $commenter );
	}
	$avatar_email = get_comment_author_email();
	$avatar_size = apply_filters( 'avatar_size', '32' ); // Available filter: avatar_size
	$avatar = str_replace( "class='avatar", "class='photo avatar", get_avatar( $avatar_email, $avatar_size ) );
	echo $avatar . ' <span class="fn n">' . $commenter . '</span>';
}

// Function to filter the default gallery shortcode
function sandbox_gallery($attr) {
	global $post;
	if ( isset($attr['orderby']) ) {
		$attr['orderby'] = sanitize_sql_orderby($attr['orderby']);
		if ( !$attr['orderby'] )
			unset($attr['orderby']);
	}

	extract(shortcode_atts( array(
		'orderby'    => 'menu_order ASC, ID ASC',
		'id'         => $post->ID,
		'itemtag'    => 'dl',
		'icontag'    => 'dt',
		'captiontag' => 'dd',
		'columns'    => 3,
		'size'       => 'thumbnail',
	), $attr ));

	$id           =  intval($id);
	$orderby      =  addslashes($orderby);
	$attachments  =  get_children("post_parent=$id&post_type=attachment&post_mime_type=image&orderby={$orderby}");

	if ( empty($attachments) )
		return null;

	if ( is_feed() ) {
		$output = "\n";
		foreach ( $attachments as $id => $attachment )
			$output .= wp_get_attachment_link( $id, $size, true ) . "\n";
		return $output;
	}

	$listtag     =  tag_escape($listtag);
	$itemtag     =  tag_escape($itemtag);
	$captiontag  =  tag_escape($captiontag);
	$columns     =  intval($columns);
	$itemwidth   =  $columns > 0 ? floor(100/$columns) : 100;

	$output = apply_filters( 'gallery_style', "\n" . '<div class="gallery">', 9 ); // Available filter: gallery_style

	foreach ( $attachments as $id => $attachment ) {
		$img_lnk = get_attachment_link($id);
		$img_src = wp_get_attachment_image_src( $id, $size );
		$img_src = $img_src[0];
		$img_alt = $attachment->post_excerpt;
		if ( $img_alt == null )
			$img_alt = $attachment->post_title;
		$img_rel = apply_filters( 'gallery_img_rel', 'attachment' ); // Available filter: gallery_img_rel
		$img_class = apply_filters( 'gallery_img_class', 'gallery-image' ); // Available filter: gallery_img_class

		$output  .=  "\n\t" . '<' . $itemtag . ' class="gallery-item gallery-columns-' . $columns .'">';
		$output  .=  "\n\t\t" . '<' . $icontag . ' class="gallery-icon"><a href="' . $img_lnk . '" title="' . $img_alt . '" rel="' . $img_rel . '"><img src="' . $img_src . '" alt="' . $img_alt . '" class="' . $img_class . ' attachment-' . $size . '" /></a></' . $icontag . '>';

		if ( $captiontag && trim($attachment->post_excerpt) ) {
			$output .= "\n\t\t" . '<' . $captiontag . ' class="gallery-caption">' . $attachment->post_excerpt . '</' . $captiontag . '>';
		}

		$output .= "\n\t" . '</' . $itemtag . '>';
		if ( $columns > 0 && ++$i % $columns == 0 )
			$output .= "\n</div>\n" . '<div class="gallery">';
	}
	$output .= "\n</div>\n";

	return $output;
}

// Widget: Search; to match the Sandbox style and replace Widget plugin default
function widget_sandbox_search($args) {
	extract($args);
	$options = get_option('widget_sandbox_search');
	$title = empty($options['title']) ? __( 'Search', 'sandbox' ) : attribute_escape($options['title']);
	$button = empty($options['button']) ? __( 'Find', 'sandbox' ) : attribute_escape($options['button']);
?>
			<?php echo $before_widget ?>
				<?php echo $before_title ?><label for="s"><?php echo $title ?></label><?php echo $after_title ?>
				<form id="searchform" class="blog-search" method="get" action="<?php bloginfo('home') ?>">
					<div>
						<input id="s" name="s" type="text" class="text" value="<?php the_search_query() ?>" size="10" tabindex="1" />
						<input type="submit" class="button" value="<?php echo $button ?>" tabindex="2" />
					</div>
				</form>
			<?php echo $after_widget ?>
<?php
}

// Widget: Search; element controls for customizing text within Widget plugin
function widget_sandbox_search_control() {
	$options = $newoptions = get_option('widget_sandbox_search');
	if ( $_POST['search-submit'] ) {
		$newoptions['title'] = strip_tags(stripslashes( $_POST['search-title']));
		$newoptions['button'] = strip_tags(stripslashes( $_POST['search-button']));
	}
	if ( $options != $newoptions ) {
		$options = $newoptions;
		update_option( 'widget_sandbox_search', $options );
	}
	$title = attribute_escape($options['title']);
	$button = attribute_escape($options['button']);
?>
	<p><label for="search-title"><?php _e( 'Title:', 'sandbox' ) ?> <input class="widefat" id="search-title" name="search-title" type="text" value="<?php echo $title; ?>" /></label></p>
	<p><label for="search-button"><?php _e( 'Button Text:', 'sandbox' ) ?> <input class="widefat" id="search-button" name="search-button" type="text" value="<?php echo $button; ?>" /></label></p>
	<input type="hidden" id="search-submit" name="search-submit" value="1" />
<?php
}

// Widget: Meta; to match the Sandbox style and replace Widget plugin default
function widget_sandbox_meta($args) {
	extract($args);
	$options = get_option('widget_meta');
	$title = empty($options['title']) ? __( 'Meta', 'sandbox' ) : attribute_escape($options['title']);
?>
			<?php echo $before_widget; ?>
				<?php echo $before_title . $title . $after_title; ?>
				<ul>
					<?php wp_register() ?>

					<li><?php wp_loginout() ?></li>
					<?php wp_meta() ?>

				</ul>
			<?php echo $after_widget; ?>
<?php
}

// Widget: RSS links; to match the Sandbox style
function widget_sandbox_rsslinks($args) {
	extract($args);
	$options = get_option('widget_sandbox_rsslinks');
	$title = empty($options['title']) ? __( 'RSS Links', 'sandbox' ) : attribute_escape($options['title']);
?>
		<?php echo $before_widget; ?>
			<?php echo $before_title . $title . $after_title; ?>
			<ul>
				<li><a href="<?php bloginfo('rss2_url') ?>" title="<?php echo wp_specialchars( get_bloginfo('name'), 1 ) ?> <?php _e( 'Posts RSS feed', 'sandbox' ); ?>" rel="alternate" type="application/rss+xml"><?php _e( 'All posts', 'sandbox' ) ?></a></li>
				<li><a href="<?php bloginfo('comments_rss2_url') ?>" title="<?php echo wp_specialchars(bloginfo('name'), 1) ?> <?php _e( 'Comments RSS feed', 'sandbox' ); ?>" rel="alternate" type="application/rss+xml"><?php _e( 'All comments', 'sandbox' ) ?></a></li>
			</ul>
		<?php echo $after_widget; ?>
<?php
}

// Widget: RSS links; element controls for customizing text within Widget plugin
function widget_sandbox_rsslinks_control() {
	$options = $newoptions = get_option('widget_sandbox_rsslinks');
	if ( $_POST['rsslinks-submit'] ) {
		$newoptions['title'] = strip_tags( stripslashes( $_POST['rsslinks-title'] ) );
	}
	if ( $options != $newoptions ) {
		$options = $newoptions;
		update_option( 'widget_sandbox_rsslinks', $options );
	}
	$title = attribute_escape($options['title']);
?>
	<p><label for="rsslinks-title"><?php _e( 'Title:', 'sandbox' ) ?> <input class="widefat" id="rsslinks-title" name="rsslinks-title" type="text" value="<?php echo $title; ?>" /></label></p>
	<input type="hidden" id="rsslinks-submit" name="rsslinks-submit" value="1" />
<?php
}

// Widgets plugin: intializes the plugin after the widgets above have passed snuff
function sandbox_widgets_init() {
	if ( !function_exists('register_sidebars') )
		return;

	// Formats the Sandbox widgets, adding readability-improving whitespace
	$p = array(
		'before_widget'  =>   "\n\t\t\t" . '<li id="%1$s" class="widget %2$s">',
		'after_widget'   =>   "\n\t\t\t</li>\n",
		'before_title'   =>   "\n\t\t\t\t". '<h3 class="widgettitle">',
		'after_title'    =>   "</h3>\n"
	);

	// Table for how many? Two? This way, please.
	register_sidebars( 2, $p );

	// Finished intializing Widgets plugin, now let's load the Sandbox default widgets; first, Sandbox search widget
	$widget_ops = array(
		'classname'    =>  'widget_search',
		'description'  =>  __( "A search form for your blog (Sandbox)", "sandbox" )
	);
	wp_register_sidebar_widget( 'search', __( 'Search', 'sandbox' ), 'widget_sandbox_search', $widget_ops );
	unregister_widget_control('search'); // We're being Sandbox-specific; remove WP default
	wp_register_widget_control( 'search', __( 'Search', 'sandbox' ), 'widget_sandbox_search_control' );

	// Sandbox Meta widget
	$widget_ops = array(
		'classname'    =>  'widget_meta',
		'description'  =>  __( "Log in/out and administration links (Sandbox)", "sandbox" )
	);
	wp_register_sidebar_widget( 'meta', __( 'Meta', 'sandbox' ), 'widget_sandbox_meta', $widget_ops );
	unregister_widget_control('meta'); // We're being Sandbox-specific; remove WP default
	wp_register_widget_control( 'meta', __( 'Meta', 'sandbox' ), 'wp_widget_meta_control' );

	//Sandbox RSS Links widget
	$widget_ops = array(
		'classname'    =>  'widget_rss_links',
		'description'  =>  __( "RSS links for both posts and comments (Sandbox)", "sandbox" )
	);
	wp_register_sidebar_widget( 'rss_links', __( 'RSS Links', 'sandbox' ), 'widget_sandbox_rsslinks', $widget_ops );
	wp_register_widget_control( 'rss_links', __( 'RSS Links', 'sandbox' ), 'widget_sandbox_rsslinks_control' );
}

// Translate, if applicable
load_theme_textdomain('sandbox');

// Runs our code at the end to check that everything needed has loaded
add_action( 'init', 'sandbox_widgets_init' );

// Registers our function to filter default gallery shortcode
add_filter( 'post_gallery', 'sandbox_gallery', $attr );

// Adds filters for the description/meta content in archives.php
add_filter( 'archive_meta', 'wptexturize' );
add_filter( 'archive_meta', 'convert_smilies' );
add_filter( 'archive_meta', 'convert_chars' );
add_filter( 'archive_meta', 'wpautop' );

// Remember: the Sandbox is for play.
?>